<?php

namespace App\Service;

use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Util\ResponseChecker;

//============支付宝支付===========
use Alipay\EasySDK\Kernel\Config;
use App\Http\Controllers\PaymentController;
use App\Models\Order;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class PaymentService
{
    /**
     * @param array $lit
     * @return bool|void
     * @throws \Exception
     * 退款
     */
    public function backMoney(array $lit)
    {
        return $this->doReturn($lit);
    }
    /**
     * @param $data
     * @return bool|void
     * @throws \Exception
     * 支付宝退款
     */
    public function doReturn($data)
    {
        $res = self::baseReturn($data);
        if ($res == true) {
            return $res;
        } else {
            return false;
        }
    }

    /***
     * @throws \Exception
     * 退款
     */
    private function baseReturn($data)
    {
        Factory::setOptions(self::getOptions());
        try {
            //2. 发起API调用（以支付能力下的统一收单交易创建接口为例）
            //这里使用三段 表示 具体看手册 https://opendocs.alipay.com/open/54/103419/
            $result = Factory::payment()->common()
                ->optional("out_request_no",$data['back_sn']) //out_request_no 是退款的商户自定义编号 不能重复 重复的话会导致后一次的失败
                ->refund($data['sn'], $data['money']); // refund的是退款的方法 还有其他方法可以参见手册  第一个参数为支付时的商户自定义订单号 第二个参数为需要退款的金额
            //这里查看 手册 https://github.com/alipay/alipay-easysdk/blob/master/APIDoc.md

            $this->writeLog($result);
            $responseChecker = new ResponseChecker();
            //3. 处理响应或异常
            if ($w = $responseChecker->success($result)) {
                return $w;
                //dump($w);
                //处理其他内容

                // return $result->body;
                //echo "调用成功" . PHP_EOL;
            } else {
                //echo "调用失败，原因：" . $result->msg . "，" . $result->subMsg . PHP_EOL;
                $str = "调用失败，原因：" . $result->msg . "，" . $result->subMsg . PHP_EOL;
                $this->writeLog($str,false);
                return false;
            }
        } catch (Exception $e) {
            //echo "调用失败，" . $e->getMessage() . PHP_EOL;
            return false;
        }
        // $this->ok(200, '成功', ['data' => $res]);
    }
    public static function pay($data)
    {
        //1. 设置参数（全局只需设置一次）
        Factory::setOptions(self::getOptions());
        try {
            //2. 发起API调用（以支付能力下的统一收单交易创建接口为例）
//            $result = Factory::payment()->common()->create($data['subject'], $data['sn'], $data['pay_price'], $data['user_id'],$data['order_type']);
            $result = Factory::payment()->app()->pay($data['subject'], $data['sn'], $data['pay_price']);
            $responseChecker = new ResponseChecker();
            //3. 处理响应或异常
            if ($responseChecker->success($result)) {
                return $result->body;
                //echo "调用成功" . PHP_EOL;
            } else {
                //echo "调用失败，原因：" . $result->msg . "，" . $result->subMsg . PHP_EOL;
                return false;
            }
        } catch (Exception $e) {
            //echo "调用失败，" . $e->getMessage() . PHP_EOL;
            return false;
        }
    }

    public static function getOptions()
    {
        $options = new Config();
        $options->protocol = 'https';
        $options->gatewayHost = 'openapi.alipay.com';
        $options->signType = 'RSA2';
        $options->appId = config('omnipay.options.app_id');//'<-- 请填写您的AppId，例如：2019022663440152 -->';
        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        $options->merchantPrivateKey = config('omnipay.options.private_key');//'<-- 请填写您的应用私钥，例如：MIIEvQIBADANB ... ... -->';
//        $options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt -->';
//        $options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt" -->';
//        $options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt -->';
        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        $options->alipayPublicKey = config('omnipay.options.public_key');//'<-- 请填写您的支付宝公钥，例如：MIIBIjANBg... -->';
        //可设置异步通知接收服务地址（可选）
        $options->notifyUrl = config('omnipay.options.notify_url');//"<-- 请填写您的支付类接口异步通知接收服务地址，例如：https://www.test.com/callback -->";
        return $options;
    }
    /**
     * 写入删除log
     */
    public function writeLog($data,$tag=true) {
        if($tag){
            $data = json_encode($data);
        }
//        $array = '<?php ' . "\n" . ' $res=' . var_export($data, true) . ';' . "\n";
        Log::channel('payment')->info($data);
        Log::channel('payment')->info("#####################################");
    }
}
